package com.nio.c1_NettyTest;

import lombok.extern.slf4j.Slf4j;

import java.io.FileInputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

/**
 * @version No one is coming, unless you change yourself!!!
 * @author： pang-yun
 * @date： 2021-05-27 19:33
 */


/*文件可能很大，缓冲区因为占用内存，不能太大，   所以很多时候需要多次读取     读取文件完毕之后会返回-1   所以对于大文件 我们可以用buffer多次读取，检测-1看其是否已经读完
 * */

//逻辑  ： 获取channel getChannel  开启缓冲区 Buffer.allocate   用channel 将数据读取到buffer中 channel.read
// 将buffer的读模式切换到写模式 buffer.get 得到内容
@Slf4j
public class ByteBufferTest {
    public static void main(String[] args) {

        //获取FileChannel的两种方式   ：  1.输入输出流       2.RandomAccessFile

        //      .twr 快捷键  可以快速生成try   catch
        try (FileChannel channel = new FileInputStream("data.txt").getChannel()) {

            //准备缓冲区    ByteBuffer.allocate 本质是在 内存中 划分一块缓冲区
            ByteBuffer buffer = ByteBuffer.allocate(10);

            while (true) {

                //用channel 读取 数据，   写入缓冲区 buffer
                int readLength = channel.read(buffer);  //文件读取完毕时，会返回-1、

                log.debug("读取的字节数 {}", readLength);

                if (readLength == -1) {
                    break;
                }
                //打印buffer中的内容
                buffer.flip();    //将buffer的模式从读切换到 写

                while (buffer.hasRemaining()) {   //buffer  是否还存有数据

                    byte b = buffer.get();

                    log.debug("读取到的字符是：：：：{}", (char) b);
                }

                //将buffer  由读模式切换到写模式
                buffer.clear();

            }


        } catch (IOException e) {
        }
    }
}
